vcTask

Simulation time can be consumed by using 'vcTasks' with 'await', but only within an 'async' function.

See in: Overview

Module: vcCore

Parent: -

Children -

Referenced by: vcCore.allTasks(), vcCore.anyTask(), vcCore.condition(), vcCore.delay(), ... (see more)
vcCore.allTasks()
vcCore.anyTask()
vcCore.condition()
vcCore.delay()
vcServoController.move()
vcServoController.moveJoint()

Example: vcTask Examples

"A collection of different ways to create a vcTask."

import vcCore as vc

comp = vc.getComponent()

async def OnRun():
   
  # wait delay
  await vc.delay(2) # returns vcTask
  print ("delay passed")

  # wait servo motion
  servo = comp.findBehavior('Servo Controller')
  servo.setJointTarget(0,100)
  await servo.move() # returns vcTask
  print ("servo motion passed")

  # wait signal value. Signal needs to be connected to the script
  signal = comp.findBehavior('BooleanSignal')
  await signal.waitFor(True) # returns vcTask
  print ("signal value received")

  # wait any event, e.g. vcNode.OnNodeTransform 
  # gets triggered when link moved with e.g. Interact tool or by servo
  link = comp.findNode("Link_1")
  await link.OnNodeTransform.wait() # returns vcTask
  print ("OnNodeTransform event arrived")

Example: vcTask Async Advanced Example

"""
An example of two asynchronously driven joint routines
"""

import vcCore as vc

comp = vc.getComponent()
servo_blue = comp.findBehavior('ServoController2')
servo_red = comp.findBehavior('ServoController1')


def get_next_blue_task(blue_i):
  if blue_i == 0:
    return servo_blue.moveJoint(0, 100)
  elif blue_i == 1:
    return vc.delay(1)
  elif blue_i == 2:
    return servo_blue.moveJoint(0, 0)
  else:
    print ("blue done")
    return None


def get_next_red_task(red_i):
  if red_i == 0: 
    return servo_red.moveJoint(0, 500)
  elif red_i == 1:
    return vc.delay(1)
  elif red_i == 2:
    return servo_red.moveJoint(0, 0)
  else:
    print ("red done")
    return None


async def OnRun():
  tasks = []
  red_i = 0
  blue_i = 0
  red_t = get_next_red_task(red_i)
  blue_t = get_next_blue_task(blue_i)
  tasks = [red_t, blue_t]
  
  while True:
    await vc.anyTask(tasks, autoCancel=False)
    if red_t and red_t.done():
      red_i += 1
      red_t = get_next_red_task(red_i)
    if blue_t and blue_t.done():
      blue_i += 1
      blue_t = get_next_blue_task(blue_i)
      
    tasks = []
    if red_t:
      tasks.append(red_t)
    if blue_t:
      tasks.append(blue_t)
      
    if len(tasks) == 0:
      return